package com.bibimaya.auto.mapper.dao.utils;

import com.bibimaya.auto.mapper.dao.constant.Const;

/**
 * Created by lijianwei
 */
public class UpdateSqlUtil {

    public static String updateByIdSql(Class entityClass){
        return updateByIdSql(EntityMap.newInstance(entityClass, null));
    }

    public static String updateByIdSql(Class entityClass, String suffix){
        return updateByIdSql(EntityMap.newInstance(entityClass, suffix));
    }

    public static String updateByIdSql(EntityMap entityMap) {
        FieldMap pk = entityMap.getPrimaryKeyField();
        StringBuffer sql = new StringBuffer();
        sql.append("<script>");
        sql.append(Const.NEW_LINE);
        sql.append(Const.TAB);
        sql.append("update ");
        sql.append(entityMap.getTable());
        sql.append(Const.NEW_LINE);
        sql.append(Const.TAB);
        sql.append("<set>");
        String tab = Const.TAB + Const.TAB;
        for (int i = 0; i < entityMap.getFields().size(); i++) {
            FieldMap fm = entityMap.getFields().get(i);
            if (pk.getField().equals(fm.getField())) {
                continue;
            }
            sql.append(updateFieldSql(fm, tab));
        }
        sql.append(Const.NEW_LINE);
        sql.append(Const.TAB);
        sql.append("</set>");
        sql.append(Const.NEW_LINE);
        sql.append(Const.TAB);
        sql.append("where ");
        sql.append(pk.getColumn()).append("=#{").append(pk.getField()).append("}");
        sql.append(Const.NEW_LINE);
        sql.append("</script>");
        return sql.toString();
    }

    public static String updateByOvSql(EntityMap entityMap, String whereSqlAppend) {
        FieldMap pk = entityMap.getPrimaryKeyField();
        StringBuffer sql = new StringBuffer();
        sql.append("<script>");
        sql.append(Const.NEW_LINE);
        sql.append(Const.TAB);
        sql.append("update ");
        sql.append(entityMap.getTable());
        sql.append(Const.NEW_LINE);
        sql.append(Const.TAB);
        sql.append("<set>");
        String tab = Const.TAB + Const.TAB;
        for (int i = 0; i < entityMap.getFields().size(); i++) {
            FieldMap fm = entityMap.getFields().get(i);
            if (pk.getField().equals(fm.getField())) {
                continue;
            }
            sql.append(updateFieldSql(fm, tab));
        }
        sql.append(Const.NEW_LINE);
        sql.append(Const.TAB);
        sql.append("</set>");
        sql.append(Const.NEW_LINE);
        sql.append(WhereSqlUtil.whereSqlWithOv(entityMap, Const.TAB, whereSqlAppend));
        sql.append("</script>");
        return sql.toString();
    }


    public static String updateFieldSql(FieldMap fm, String tab){
        if(fm == null){
            return Const.STR_EMPTY;
        }
        String tabTmp = tab == null ? Const.STR_EMPTY : tab;
        StringBuffer sql = new StringBuffer();
        sql.append(Const.NEW_LINE);
        sql.append(tabTmp);
        sql.append("<if test='" + fm.getField() + " != null'>");
        sql.append(Const.NEW_LINE);
        sql.append(tabTmp).append(Const.TAB);
        sql.append("`"+fm.getColumn()+"` ").append("= #{").append(fm.getField()).append("}").append(",");
        sql.append(Const.NEW_LINE);
        sql.append(tabTmp);
        sql.append("</if>");
        return sql.toString();
    }

    public static String updateListSql(Class entityClass){
        return updateListSql(EntityMap.newInstance(entityClass, null));
    }

    public static String updateListSql(EntityMap entityMap){
        FieldMap pk = entityMap.getPrimaryKeyField();
        StringBuffer sql = new StringBuffer();
        sql.append("<script>");
        sql.append(Const.NEW_LINE);
        sql.append(Const.TAB);
        sql.append("update ").append(entityMap.getTable());
        sql.append(Const.NEW_LINE);
        sql.append(Const.TAB);
        sql.append("<trim prefix=\"set\" suffixOverrides=\",\">");
        sql.append(Const.NEW_LINE);
        FieldMap idFm = null;
        for (int i = 0; i < entityMap.getFields().size(); i++) {
            FieldMap fm = entityMap.getFields().get(i);
            if ("id".equals(fm.getField())) {
                idFm = fm;
                continue;
            }
            sql.append(updateFiledCaseWhenSql(fm, Const.TAB+Const.TAB, pk));
        }
        sql.append(Const.NEW_LINE);
        sql.append(Const.TAB);
        sql.append("</trim>");
        sql.append(Const.NEW_LINE);
        sql.append(Const.TAB);
        sql.append("<where>");
        sql.append(Const.NEW_LINE);
        sql.append(WhereSqlUtil.inFieldWhere(idFm, Const.TAB + Const.TAB));
        sql.append(Const.TAB);
        sql.append("</where>");
        sql.append(Const.NEW_LINE);
        sql.append("</script>");
        return sql.toString();
    }

    public static String updateFiledCaseWhenSql(FieldMap fm, String tab, FieldMap pk){
        StringBuffer sql = new StringBuffer();
        sql.append(tab);
        sql.append("<trim prefix='`"+fm.getColumn()+"` = case' suffix=' else `"+fm.getColumn()+"` end,'>");
        sql.append(Const.NEW_LINE);
        sql.append(tab).append(Const.TAB);
        sql.append("<foreach collection='list' item='item' >");
        sql.append(Const.NEW_LINE);
        sql.append(tab).append(Const.TAB).append(Const.TAB);
        sql.append("<if test='item."+fm.getField()+" != null'>");
        sql.append(Const.NEW_LINE);
        sql.append(tab).append(Const.TAB).append(Const.TAB).append(Const.TAB);
        sql.append("when ");
        sql.append(pk.getColumn()).append("=#{item.").append(pk.getField()).append("}");
        sql.append(" then #{item."+fm.getField()+"}");
        sql.append(Const.NEW_LINE);
        sql.append(tab).append(Const.TAB).append(Const.TAB);
        sql.append("</if>");
        sql.append(Const.NEW_LINE);
        sql.append(tab).append(Const.TAB);
        sql.append("</foreach>");
        sql.append(Const.NEW_LINE);
        sql.append(tab);
        sql.append("</trim>");
        sql.append(Const.NEW_LINE);
        return sql.toString();
    }

}
